<?php
/**************************************
 * Form Class
 * 
 * Brainfucker.ru (c) Oleg Illarionov
 **************************************/

class form {	
	# Имя формы
	var $name='form';
	
	# Действие формы (адрес на который будет отправлен пользователь)
	var $action='';
	
	# Метод отправки данных с формы (POST, GET, AJAX)
	var $method='POST';
	
	# Поля формы
	var $fields=array();
	
	# вид в котором выводятся поля формы
	var $tutorial="%1\$s %2\$s";
	
	
	/**
	 * Конструктор
	 * При использовании типа AJAX необходимо чтобы был подключён
	 * модифецироованный jquery из папки engine/js
	 *
	 * @param string $name
	 * @param string $action
	 * @param string $type (POST, GET, AJAX)
	 */
	function form($name,$action,$method) {
		$this->name = $name;
		$this->action = $action;
		$this->method = strtoupper($method);
	}
	
	/**
	 * установить шаблон вывода полей
	 *
	 * @param string $tutorial
	 */
	function setTutorial($tutorial) {
		$this->tutorial=$tutorial;
	}
	
	
	
	/**
	 * Добавить в форму поле
	 * Поддерживаются поля: text, textarea, 
	 * select (если нужна возможность кроме выбираемого вводить
	 * другое значение добавьте в параметр value элемент  с ключём other
	 * например array("other"=>"свой вариант"))
	 *
	 * @param string $text
	 * @param string $name
	 * @param mixed $value
	 * @param string $type 
	 * @param action $action
	 */
	function addField($text, $name='', $type='text', $value='', $onchange=null, $active=true) {
		if (is_array($text)) $this->fields[]=$text; else {
			$this->fields[]=array(
				'text'=>$text,
				'name'=>$name,
				'value'=>$value,
				'type'=>$type,
				'onchange'=>$onchange,
				'active'=>$active
			);
		}
	}
	
	/**
	 * Добавить в форму поля из массива
	 *
	 * @param array $array
	 */
	function addFields($array) {
		if (!empty($array)) $this->fields=$this->fields+$array;
	}
	
	/**
	 * Добавить кнопку отправки
	 *
	 * @param string $value
	 * @param string $name
	 */
	function addSubmit($value='Отправить', $name='') {
		$this->fields[]=array(
			'text'=>'',
			'name'=>$name,
			'value'=>$value,
			'type'=>'submit'
		);
	}
	
	/**
	 * Вывод формы
	 */
	function Render() {
		if ($this->method == 'AJAX') $out='<script>$(document).ready(function(){ $("#form-'.$this->name.'").ajaxSubmit();});</script>';
			
		@$out.='<form id="form-'.$this->name.'" name="'.$this->name.'" action="'.$this->action.'" method="'.(($this->method == 'GET')?'GET':'POST').'">';
		foreach ($this->fields as $field) {
			switch ($field['type']) {
				case 'radio':
					$radio='';
					foreach ($field['value'] as $key=>$val) {
						if (is_array($val)) {$key=$val['id']; $val=$val['name'];}
						$radio.='<input type="radio" style="width:12px; height:12px; border:none;" name="'.$field['name'].'"'.((($_POST[$field['name']]==$key) || (!isset($_POST[$field['name']]) && $radio==''))?' checked':'').' value="'.$key.'">'.$val.'<br>';
					}
					$out.=sprintf($this->tutorial,$field['text'],$radio);
					break;
				case 'select':
					# возможность указывать значение не перечисленное в select с помощю элемента с ключём other
					if (isset($field['value']['other'])) {
						$other=' onchange="if (this.value==\'other\') document.getElementById(\''.$field['name'].'_val\').style.display=\'block\'; else document.getElementById(\''.$field['name'].'_val\').style.display=\'none\'; '.str_replace('"',"'",$field['onchange']).'"';
						$hiddenval = '<input style="margin-top:2px; display:none;" id="'.$field['name'].'_val" name="'.$field['name'].'_val" type="text">';
					} else {
						if (!empty($field['onchange'])) $other=' onchange="'.str_replace('"',"'",$field['onchange']).'"';
						else $other='';
						$hiddenval='';
					}
					$select='<select '.(($field['active']==false)?'DISABLED ':'').'id="'.$field['name'].'"'.$other.' name="'.$field['name'].'">';
					
					foreach ($field['value'] as $key=>$val) {
						if (is_array($val)) {$key=$val['id']; $val=$val['name'];}
						$select.='<option value="'.$key.'">'.$val.'</option>';						
					}
					$select.='</select>'.$hiddenval;
					$out.=sprintf($this->tutorial,$field['text'],$select);
					break;
				case 'textarea':
					$out.=sprintf($this->tutorial,$field['text'],'<textarea id="'.$field['name'].'" name="'.$field['name'].'">'.((!empty($field['value']))?$field['value']:$_POST[$field['name']]).'</textarea>');
					break;
				default:
					$out.=sprintf($this->tutorial,$field['text'],'<input id="'.$field['name'].'" name="'.$field['name'].'" type="'.$field['type'].'" value="'.((!empty($field['value']))?$field['value']:$_POST[$field['name']]).'" />');
					break;
			}
		}
		$out.='</form>';
		echo $out;
	}	
}
?>